home *** CD-ROM | disk | FTP | other *** search
- /*
- File: See.c
-
- Contains: A Sample MovieTalk Conferencing Application
-
- Written by: Guy Riddle
-
- Copyright: © 1994 by Apple Computer, Inc., all rights reserved.
-
- */
-
- #include <Types.h>
- #include <QuickDraw.h>
- #include <Fonts.h>
- #include <Events.h>
- #include <Windows.h>
- #include <Menus.h>
- #include <Dialogs.h>
- #include <Desk.h>
- #include <ToolUtils.h>
- #include <Memory.h>
- #include <Resources.h>
- #include <SegLoad.h>
- #include <Files.h>
- #include <Folders.h>
- #include <OSUtils.h>
- #include <DiskInit.h>
- #include <Scrap.h>
-
- #include <String.h>
- #include <Strings.h>
- #include <stdio.h>
-
- #include <QuickTimeConferencing.h>
-
- #include "See.h"
-
- typedef EventRecord *EventRecordPtr;
- typedef Byte *BytePtr;
-
- #define PW_CLEAR 'pw-C'
-
- #define MAXMEMBERS 3
-
- typedef struct {
- Rect box;
- MTConferenceMember member;
- MTControllerComponent controller;
- } Member, *MemberPtr;
-
- #define WRECT(top, left) (top),(left),(top+120),(left+160)
-
- Member gMember[MAXMEMBERS+1] = {
- { WRECT(100, 100) },
- { WRECT(100, 300) },
- { WRECT(300, 100) },
- { WRECT(300, 300) },
- };
-
- MTCString63 gUserName, gPassword;
-
- ComponentInstance gCC, gBC;
- MTConferenceToken gConference;
-
- MemberPtr FindMember(MTConferenceMember);
-
- void Initialize(void);
- void StartMovieTalk(void);
- void StopMovieTalk(void);
- void EventLoop(void);
-
- void DoToolboxEvent(EventRecordPtr);
- void DoKeyDownEvent(EventRecordPtr);
- void DoMouseDownEvent(EventRecordPtr);
- void DoDiskEvent(EventRecordPtr);
- void AdjustMenus(void);
- void DoMenuBar(long);
- void DoAppleMenu(short);
- void DoFileMenu(short);
- void DoVideoPhoneMenu(short);
- void DoMenuCall(void);
- void DoMenuHangUp(void);
-
- void DoConferenceEvent(MTConferenceEventPtr);
- void DoConfReady(MTConferenceEventPtr);
- void DoMemberReady(MTConferenceEventPtr);
- void DoMemberTerminated(MTConferenceEventPtr);
- void DoConfTerminated(MTConferenceEventPtr);
- void DoPhoneRinging(MTConferenceEventPtr);
- Boolean Requires(MTConferenceMember, OSType);
- Handle GetPassword(Ptr);
- void EnableButton(DialogRef, short, Boolean);
- void GetValue(BytePtr, DialogRef, short);
- void DoIncomingCall(MTConferenceEventPtr);
- void DoMemberJoining(MTConferenceEventPtr);
-
- void CallOne(MTNamePtr);
- void SaveMovie(Handle);
- void SaveSnapshot(Handle);
- void Sorry(int, int, MTConferenceMember, OSErr);
-
- /*
- * See
- *
- * This application demonstrates basic multi-party conferencing using the MovieTalk
- * Conference Component and Browser Component. It arbitrary limits the total number of
- * conference members to 4 (including yourself). Snapshots are just put in the global
- * clipboard and movies are moved to the desktop.
- *
- * • Also supported is the clear-text password request dialog for servers that require
- * authentication.
- */
-
- void main()
- {
- Initialize();
- EventLoop();
- }
-
- void
- Initialize(
- void
- ){
- Handle menuBar;
- DialogPtr dp;
-
- InitGraf((Ptr) &qd.thePort);
- InitFonts();
- InitWindows();
- InitMenus();
- TEInit();
- InitDialogs(nil);
- InitCursor();
-
- dp = GetNewDialog(rAboutAlert, nil, (WindowRef) -1);
- DrawDialog(dp);
-
- StartMovieTalk();
-
- menuBar = GetNewMBar(rMenuBar);
-
- SetMenuBar(menuBar);
- DisposHandle(menuBar);
- AddResMenu(GetMHandle(mApple), 'DRVR');
-
- DrawMenuBar();
-
- DisposeDialog(dp);
- }
-
- void
- StartMovieTalk(
- void
- ){
- StringHandle sh;
- Handle srvt;
-
- sh = GetString(kMTAppleTalkUserName);
-
- strncpy((char*)gUserName, (const char*)*sh+1, (size_t)**sh);
-
- gCC = OpenDefaultComponent(kMTConferenceType, kMTMovieTalkSubType);
-
- gMember[0].controller = MTConferenceNewPreparedController(gCC, &gMember[0].box,
- mtMediaSourcePrepMask+mtGrabVideoPrepMask+mtGrabAudioPrepMask+mtWindowVisiblePrepMask+mtControllerVisiblePrepMask+mtEnableSnapshotPrepMask+mtEnableRecordPrepMask,
- 0);
-
- srvt = GetResource('srvt', rServiceTypes);
- HLock(srvt);
-
- MTConferenceListen(gCC, gUserName, gUserName, (MTCString)*srvt);
- ReleaseResource(srvt);
-
- gBC = OpenDefaultComponent(kMTBrowserType, kMTAppleTalkSubType);
- }
-
- void
- EventLoop(
- void
- ){
- EventRecord tEvent;
- MTConferenceEvent cEvent;
-
- for(;;){
- if(MTConferenceGetNextEvent(gCC, &cEvent))
- DoConferenceEvent(&cEvent);
-
- if(WaitNextEvent(everyEvent, &tEvent, 1, 0))
- DoToolboxEvent(&tEvent);
- }
- }
-
- void
- DoToolboxEvent(
- EventRecordPtr ev
- ){
- switch(ev->what) {
- case mouseDown:
- DoMouseDownEvent(ev);
- break;
-
- case keyDown:
- DoKeyDownEvent(ev);
- break;
-
- case diskEvt:
- DoDiskEvent(ev);
- }
- }
-
- void
- DoMouseDownEvent(
- EventRecordPtr ev
- ){
- WindowPtr wp;
- short part;
-
- part = FindWindow(ev->where, &wp);
-
- switch(part){
- case inMenuBar:
- AdjustMenus();
- DoMenuBar(MenuSelect(ev->where));
- }
- }
-
- void
- DoKeyDownEvent(
- EventRecordPtr ev
- ){
- if(ev->modifiers & cmdKey){
- AdjustMenus();
- DoMenuBar(MenuKey(ev->message & charCodeMask));
- }
- }
-
- void
- DoDiskEvent(
- EventRecordPtr ev
- ){
- Point where;
-
- if(HiWord(ev->message)){
- SetPt(&where, kDILeft, kDITop);
- DIBadMount(where, ev->message);
- }
- }
-
- void
- AdjustMenus(
- void
- ){
- MenuHandle mh;
-
- mh = GetMHandle(mVideoPhone);
-
- gConference ? EnableItem(mh, iHangUp) : DisableItem(mh, iHangUp);
- FindMember(0) ? EnableItem(mh, iCall) : DisableItem(mh, iCall);
- }
-
- void
- DoMenuBar(
- long selection
- ){
- short menuID;
- short menuItem;
-
- menuID = HiWord(selection);
- menuItem = LoWord(selection);
-
- switch(menuID){
- case mApple:
- DoAppleMenu(menuItem);
- break;
-
- case mFile:
- DoFileMenu(menuItem);
- break;
-
- case mEdit: /* call SystemEdit for DA editing & MultiFinder */
- SystemEdit(menuItem-1);
- break;
-
- case mVideoPhone:
- DoVideoPhoneMenu(menuItem);
- }
-
- HiliteMenu(0);
- }
-
- void
- DoAppleMenu(
- short item
- ){
- DialogRef dp;
- Str255 daName;
- short itemHit;
-
- switch(item){
- case iAbout:
- dp = GetNewDialog(rAboutAlert, nil, (WindowRef) -1);
- SetDialogDefaultItem(dp, 1);
-
- ModalDialog(0, &itemHit);
-
- DisposeDialog(dp);
- break;
-
- default: /* all non-About items in this menu are DAs */
- GetItem(GetMHandle(mApple), item, daName);
- OpenDeskAcc(daName);
- }
- }
-
- void
- DoFileMenu(
- short item
- ){
- switch(item){
- case iQuit:
- StopMovieTalk();
-
- ExitToShell();
- }
- }
-
- void
- DoVideoPhoneMenu(
- short item
- ){
- switch(item){
- case iCall:
- DoMenuCall();
- break;
-
- case iHangUp:
- DoMenuHangUp();
- }
- }
-
- void
- StopMovieTalk(
- void
- ){
- CloseComponent(gCC);
- CloseComponent(gBC);
- }
-
- void
- DoMenuCall(
- void
- ){
- MTNameListPtr names;
- MTNamePtr np;
- int count;
-
- if(MTBrowserBrowse(gBC, 0, "\pLets go Fishing…", (MTCString)"mtlkatlk\tVideoPhone\x0Dmtlktcpi\t458\x0Dmtlkatlk\tMulticaster\x0Dmtlktcpi\t545\x0Dmtlkisdn\t-\x0D", 0, &names) != noErr)
- return;
-
- count = GetMTNameListCount(names);
- np = &(names->list[0]);
-
- while(--count >= 0)
- CallOne(np++);
-
- DisposeMTNameList(names);
- }
-
- void
- CallOne(
- MTNamePtr np
- ){
- MemberPtr mp;
-
- if(!(mp = FindMember(0)))
- return;
-
- mp->member = MTConferenceCall(gCC, (unsigned char*)"See Wiz", np);
- }
-
- void
- DoMenuHangUp(
- void
- ){
- MTConferenceTerminate(gCC, gConference);
- gConference = 0; // just to suppress menu choice
- }
-
- void
- DoConferenceEvent(
- MTConferenceEventPtr ce
- ){
- switch(ce->what){
- case mtIncomingCallEvent:
- DoIncomingCall(ce);
- break;
-
- case mtMemberJoiningEvent:
- DoMemberJoining(ce);
- break;
-
- case mtConferenceReadyEvent:
- DoConfReady(ce);
- break;
-
- case mtConferenceTerminatedEvent:
- DoConfTerminated(ce);
- break;
-
- case mtMemberReadyEvent:
- DoMemberReady(ce);
- break;
-
- case mtMemberTerminatedEvent:
- DoMemberTerminated(ce);
- break;
-
- case mtPhoneRingingEvent:
- DoPhoneRinging(ce);
- break;
-
- case mtRefusedEvent:
- Sorry(701, 1, ce->who, ce->err);
- break;
-
- case mtFailedEvent:
- Sorry(701, 2, ce->who, ce->err);
- break;
-
- case mtSnapshotTakenEvent:
- SaveSnapshot(ce->surprise);
- break;
-
- case mtMovieRecordedEvent:
- SaveMovie(ce->surprise);
- }
-
- if(ce->surprise)
- DisposeHandle(ce->surprise);
- }
-
- void
- DoIncomingCall(
- MTConferenceEventPtr ce
- ){
- MemberPtr mp;
- OSErr reason;
-
- reason = 0;
-
- if((ce->bonus & mtSendMediaModeMask) && !(ce->bonus & mtReceiveMediaModeMask))
- reason = mtConnectionRefusedErr; // no peeking
- else if(mp = FindMember(0))
- mp->member = ce->who;
- else{
- reason = paramErr;
-
- Sorry(702, 1, ce->who, 0);
- }
-
- MTConferenceReply(gCC, ce->who, reason);
- }
-
- void
- DoMemberJoining(
- MTConferenceEventPtr ce
- ){
- MemberPtr mp;
-
- if(mp = FindMember(0))
- mp->member = ce->who;
- else
- Sorry(702, 2, ce->who, 0);
- }
-
- void
- DoConfReady(
- MTConferenceEventPtr ce
- ){
- if(gConference)
- MTConferenceMerge(gCC, gConference, ce->who);
- else
- MTConferenceActivateConference(gCC, gConference = ce->who, gMember[0].controller);
- }
-
- void
- DoMemberReady(
- MTConferenceEventPtr ce
- ){
- MemberPtr mp;
- MTControllerComponent mtc;
-
-
- if(ce->bonus & mtReceiveMediaModeMask){
- if(!(mp = FindMember(ce->who)))
- return;
-
- mtc = MTConferenceNewPreparedController(gCC, &mp->box,
- mtWindowVisiblePrepMask+mtControllerVisiblePrepMask+mtEnableSnapshotPrepMask+mtEnableRecordPrepMask,
- MTConferenceGetMemberName(gCC, mp->member));
-
- mp->controller = mtc;
- }else
- mtc = 0;
-
- MTConferenceActivateMember(gCC, ce->who, mtc);
- }
-
- void
- DoMemberTerminated(
- MTConferenceEventPtr ce
- ){
- MemberPtr mp;
-
- if(!(mp = FindMember(ce->who)))
- return;
-
- if(mp->controller)
- MTConferenceDisposeController(gCC, mp->controller);
-
- mp->controller = 0;
- mp->member = 0;
- }
-
- void
- DoConfTerminated(
- MTConferenceEventPtr ce
- ){
- if(gConference == ce->who)
- gConference = 0;
- }
-
- void
- DoPhoneRinging(
- MTConferenceEventPtr ce
- ){
- Handle ph;
-
- if((ce->bonus & mtRequiredMessagesModeMask) && Requires(ce->who, PW_CLEAR) && (ph = GetPassword((Ptr)MTConferenceGetMemberName(gCC, ce->who))))
- MTConferenceSendMessageToMember(gCC, ce->who, ph, PW_CLEAR, 1);
- }
-
- Boolean
- Requires(
- MTConferenceMember who,
- OSType type
- ){
- MTCapabilitiesHandle ch;
- MTCapabilitiesPtr cp;
- int n;
-
- ch = MTConferenceGetMemberMessageCapabilities(gCC, who);
-
- for(n = (*ch)->count, cp = (*ch)->capability; --n >= 0; cp++)
- if(type == cp->messageType && cp->desires == mtMessageRequiredCapability){
- DisposeHandle((Handle) ch);
- return(true);
- }
-
- DisposeHandle((Handle) ch);
- return(false);
- }
-
- Handle
- GetPassword(
- Ptr name
- ){
- DialogRef dp;
- short itemHit;
- Handle ph;
- Str255 p1;
- Str255 p2;
-
- p2[0] = 0;
- ParamText(p2, c2pstr(strcpy(p1, (char*)name)), p2, p2);
- gPassword[0] = 0;
-
- dp = GetNewDialog(rPassword, 0, (WindowRef) -1);
- SetDialogDefaultItem(dp, diOK);
- SetDialogCancelItem(dp, diCancel);
- SetDialogTracksCursor(dp, true);
- PostEvent(keyDown, '\b'); // ick
-
- do{
- EnableButton(dp, diOK, gPassword[0]);
-
- ModalDialog(0, &itemHit);
-
- GetValue(gPassword, dp, diPassword);
- }while(itemHit > diCancel);
-
- DisposeDialog(dp);
- InitCursor();
-
- if(itemHit == diCancel)
- return(0);
-
- PtrToHand(gPassword, &ph, strlen((char*)gPassword)+1);
-
- return(ph);
- }
-
- void
- EnableButton(
- DialogRef dp,
- short item,
- Boolean enabled
- ){
- Handle ih;
- Rect rect;
- short type;
-
- GetDialogItem(dp, item, &type, &ih, &rect);
-
- if(enabled)
- type &= ~itemDisable;
- else
- type |= itemDisable;
-
- HiliteControl((ControlHandle) ih, enabled ? 0 : 255);
-
- SetDialogItem(dp, item, type, ih, &rect);
-
- SetPort(dp);
- InsetRect(&rect, -5, -5);
- InvalRect(&rect);
- }
-
- void
- GetValue(
- BytePtr p,
- DialogRef dp,
- short item
- ){
- Handle ih;
- Rect rect;
- short type;
-
- GetDialogItem(dp, item, &type, &ih, &rect);
- GetDialogItemText(ih, p);
-
- if(p[0] && p[p[0]] < ' '){
- p[0]--; // strip CR or other junk
- SetDialogItemText(ih, p);
- }
-
- p2cstr(p);
- }
-
- void
- SaveSnapshot(
- Handle pic
- ){
- ZeroScrap();
-
- HLock(pic);
-
- PutScrap(GetHandleSize(pic), 'PICT', *pic);
- }
-
- void
- SaveMovie(
- Handle h
- ){
- Ptr p;
- int i;
- long dirid;
- short vrefnum;
- FSSpecPtr temp;
- FSSpec spec;
- Str255 newname;
-
- HLock(h);
- temp =(FSSpecPtr) *h;
-
- FindFolder(kOnSystemDisk, kDesktopFolderType, true, &vrefnum, &dirid);
- FSMakeFSSpec(vrefnum, dirid, c2pstr(""), &spec);
- FSpCatMove(temp, &spec); // move it to the desktop
-
- FSMakeFSSpec(vrefnum, dirid, temp->name, &spec);
- GetIndString(newname, rWildSTRs, srMovieName);
- p = (Ptr)strchr(p2cstr(newname), '?');
-
- for(i = 1; i < 10; i++){
- *p = '0'+i;
-
- if(FSpRename(&spec, newname) == noErr)
- return; // and give it a better name
- }
-
- SysBeep(1);
- }
-
- MemberPtr
- FindMember(
- MTConferenceMember who
- ){
- int i;
-
- for(i = 1; i <= MAXMEMBERS; i++)
- if(who == gMember[i].member)
- return(&gMember[i]);
-
- return(0);
- }
-
- void
- Sorry(
- int why,
- int note,
- MTConferenceMember who,
- OSErr err
- ){
- Str255 p1;
- char* p2;
- Str255 p3;
-
- GetIndString(p1, why, note);
-
- p2 = (char*)MTConferenceGetMemberName(gCC, who);
- sprintf(p3, "%d", err);
-
- ParamText(c2pstr(""), p1, c2pstr(p2), c2pstr(p3));
-
- CautionAlert(why, 0);
- }